﻿Процедура ГлобальныйПоискПоКоду(СтрокаПоиска, РезультатПоиска, ДопПараметры) Экспорт
	
	Номер = СтрокаПоиска;
	Пока СтрДлина(Номер) < 9 Цикл
		Номер = "0" + Номер;
	КонецЦикла;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 	"ВЫБРАТЬ
	|	Заказ.Ссылка КАК Ссылка,
	|	Заказ.Представление КАК Представление
	|ИЗ
	|	Документ.Заказ КАК Заказ
	|ГДЕ
	|	Заказ.Номер = &Номер
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ПриходТовара.Ссылка,
	|	ПриходТовара.Представление
	|ИЗ
	|	Документ.ПриходТовара КАК ПриходТовара
	|ГДЕ
	|	ПриходТовара.Номер = &Номер
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	РасходТовара.Ссылка,
	|	РасходТовара.Представление
	|ИЗ
	|	Документ.РасходТовара КАК РасходТовара
	|ГДЕ
	|	РасходТовара.Номер = &Номер
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	Оплата.Ссылка,
	|	Оплата.Представление
	|ИЗ
	|	Документ.Оплата КАК Оплата
	|ГДЕ
	|	Оплата.Номер = &Номер";
	
	Запрос.УстановитьПараметр("Номер", Номер);
		
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		РезультатПоиска.Добавить(
			Выборка.Ссылка, 
			СтрНайтиИВыделитьОформлением(Выборка.Представление, Номер), 
			БиблиотекаКартинок.Документ);
	КонецЦикла;
	
КонецПроцедуры
 
Функция НайтиКонтрагентов(СтрокаПоиска, МаксимальноеКоличество = 0)
	РезультатПоиска = Новый Массив;
	
	Стр = СокрЛП(СтрокаПоиска);
	Строки = СтрРазделить(Стр, " ", Ложь);
	Стр = СтрСоединить(Строки, "* ") + "*";
	
	// Используем полнотекстовый поиск для получения списка контрагентов,	
	СписокПолнотекстовогоПоиска = ПолнотекстовыйПоиск.СоздатьСписок(Стр, 10);
	СписокПолнотекстовогоПоиска.ИспользованиеМетаданных = ИспользованиеМетаданныхПолнотекстовогоПоиска.НеИспользовать;
	СписокПолнотекстовогоПоиска.ПолучатьОписание = Ложь;
	СписокПолнотекстовогоПоиска.ПолучатьПредставление = Истина;
		
	МассивОтбор = Новый Массив;
	МассивОтбор.Добавить(Метаданные.Справочники.Контрагенты);
	СписокПолнотекстовогоПоиска.ОбластьПоиска = МассивОтбор;
		
	СписокПолнотекстовогоПоиска.ПерваяЧасть();
	
	Для А = 0 По СписокПолнотекстовогоПоиска.Количество() - 1 Цикл
		ЭлементСпискаПолнотекстовогоПоиска = СписокПолнотекстовогоПоиска.Получить(А);
			
		Представление = СтрНайтиИВыделитьОформлением(ЭлементСпискаПолнотекстовогоПоиска.Представление, Строки);
		
		ЭлементПоиска = новый Структура("Значение,Представление");
		ЭлементПоиска.Значение = ЭлементСпискаПолнотекстовогоПоиска.Значение;
		ЭлементПоиска.Представление = ЭлементСпискаПолнотекстовогоПоиска.Представление;
		РезультатПоиска.Добавить(ЭлементПоиска);
		
		Если МаксимальноеКоличество > 0 И РезультатПоиска.Количество() > МаксимальноеКоличество Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Возврат РезультатПоиска;
КонецФункции

Функция ВыбратьОстаткиПоВзаиморасчетам(ОтборПоКонтрагентам, МаксимальноеКоличество = 0)
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ";
	Если МаксимальноеКоличество > 0 Тогда
		Запрос.Текст = Запрос.Текст + " ПЕРВЫЕ " + Строка(МаксимальноеКоличество);
	КонецЕсли;
	
	Запрос.Текст = Запрос.Текст + "
		|	ВзаиморасчетыОстатки.Валюта КАК ВалютаСсылка,
		|	ВзаиморасчетыОстатки.Валюта.Представление КАК ВалютаПредставление,
		|	ВзаиморасчетыОстатки.СуммаОстаток КАК СуммаОстаток,
		|	ВзаиморасчетыОстатки.Контрагент КАК КонтрагентСсылка,
		|	ВзаиморасчетыОстатки.Контрагент.Представление КАК КонтрагентПредставление
		|ИЗ
		|	РегистрНакопления.Взаиморасчеты.Остатки КАК ВзаиморасчетыОстатки";
	
	Если ОтборПоКонтрагентам.Количество() > 0 Тогда
		Запрос.Текст = Запрос.Текст + "
		|ГДЕ
		|	ВзаиморасчетыОстатки.Контрагент В(&Контрагенты)";
	КонецЕсли;
	
	Запрос.Текст = Запрос.Текст + "
		|УПОРЯДОЧИТЬ ПО
		|	СуммаОстаток УБЫВ";
	
	Если ОтборПоКонтрагентам.Количество() > 0 Тогда
		Запрос.УстановитьПараметр("Контрагенты", ОтборПоКонтрагентам);
	КонецЕсли;
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Возврат РезультатЗапроса.Выбрать();
КонецФункции

Процедура ГлобальныйПоискПоказатьДолги(СтрокаПоиска, РезультатПоиска, ДопПараметры) Экспорт
	ИспользоватьОтборПоКонтрагентам = Ложь;
	МаксимальноеКоличествоКонтрагентов = 5;
	ОтборПоКонтрагентам = Новый Массив;
	
	СтрокаДолг = "долг ";
	Если СтрДлина(СтрокаПоиска) > СтрДлина(СтрокаДолг) И Лев(НРег(СтрокаПоиска), СтрДлина(СтрокаДолг)) = СтрокаДолг Тогда
		// Выделяем часть строки после слова "долг"
		// Считаем, что это часть наименования контрагента
		Стр = Сред(СтрокаПоиска, 6);
		Стр = СокрЛП(Стр);
		Если ПустаяСтрока(Стр) Тогда
			Возврат;
		КонецЕсли;
		
		ИспользоватьОтборПоКонтрагентам = Истина;
		СписокКонтрагентов = НайтиКонтрагентов(Стр, МаксимальноеКоличествоКонтрагентов);

		СтрНРег = НРег(Стр);
		Для Каждого Контрагент Из СписокКонтрагентов Цикл
			// Проверяем, что искомая строка находится в представлении
			Если СтрНайти(НРег(Контрагент.Представление), СтрНРег) > 0 Тогда
				ОтборПоКонтрагентам.Добавить(Контрагент.Значение);
				Если ОтборПоКонтрагентам.Количество() = МаксимальноеКоличествоКонтрагентов Тогда
					Прервать;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла
			
	КонецЕсли;

	Выборка = ВыбратьОстаткиПоВзаиморасчетам(ОтборПоКонтрагентам, МаксимальноеКоличествоКонтрагентов);
	
	Пока Выборка.Следующий() Цикл
		
		МассивСтрок = Новый Массив;
		МассивСтрок.Добавить(Выборка.КонтрагентПредставление);
		МассивСтрок.Добавить(" ");
		МассивСтрок.Добавить(Новый ФорматированнаяСтрока(
			Формат(Выборка.СуммаОстаток, "ЧДЦ=2"), 
			Новый Шрифт(,, Истина), 
			ЦветаСтиля.ЦветАкцента));
		
		Если ЗначениеЗаполнено(Выборка.ВалютаСсылка) Тогда
			МассивСтрок.Добавить(" ");
			МассивСтрок.Добавить(Выборка.ВалютаПредставление);
		КонецЕсли;
		
		Значение = Новый Структура;
		Значение.Вставить("Операция", "Взаиморасчеты");
		Значение.Вставить("Контрагент", Выборка.КонтрагентСсылка);
		Значение.Вставить("Валюта", Выборка.ВалютаСсылка);
		РезультатПоиска.Добавить(Значение, Новый ФорматированнаяСтрока(МассивСтрок), БиблиотекаКартинок.РегистрСведений);
		
	КонецЦикла;
	
КонецПроцедуры

Процедура ГлобальныйПоискПоискКонтрагента(СтрокаПоиска, РезультатПоиска, ДопПараметры) Экспорт
	МаксимальноеКоличествоКонтрагентов = 5;	

	СписокКонтрагентов = НайтиКонтрагентов(СтрокаПоиска, МаксимальноеКоличествоКонтрагентов);
	
	//Получаем информацию по задолжностям контрагентов
	ОтборПоКонтрагентам = новый Массив;
	Для Каждого Контрагент Из СписокКонтрагентов Цикл
		ОтборПоКонтрагентам.Добавить(Контрагент.Значение);
	КонецЦикла;
	Выборка = ВыбратьОстаткиПоВзаиморасчетам(ОтборПоКонтрагентам);

	//Формируем Соответствие: Контрагент - список задолжностей
	СписокЗадолжностей = Новый Соответствие;
	Пока Выборка.Следующий() Цикл		
		Если СписокЗадолжностей.Получить(Выборка.КонтрагентПредставление) = Неопределено Тогда
			СписокЗадолжностей.Вставить(Выборка.КонтрагентПредставление, Новый Массив);
		КонецЕсли;
		
		ЗадолжностиКонтрагента = СписокЗадолжностей.Получить(Выборка.КонтрагентПредставление);
		Задолжность = Новый Структура;
		Задолжность.Вставить("Сумма", Выборка.СуммаОстаток);
		Задолжность.Вставить("Валюта", Выборка.ВалютаПредставление);
		ЗадолжностиКонтрагента.Добавить(Задолжность);
	КонецЦикла;	
	
	//Формируем результат поиска
	Для Каждого Контрагент Из СписокКонтрагентов Цикл
		Если Контрагент.Представление <> Неопределено Тогда
			ЭлементРезультатаПоиска = Новый ЭлементРезультатаГлобальногоПоиска();
			ЭлементРезультатаПоиска.Значение = Контрагент.Значение;
			ЭлементРезультатаПоиска.Представление = Контрагент.Представление;
			//Формируем информацию по долгам
			Если СписокЗадолжностей.Получить(Контрагент.Представление) <> Неопределено Тогда
				Задолжности = СписокЗадолжностей.Получить(Контрагент.Представление);
				МассивСтрок = Новый Массив;
				МассивСтрок.Добавить(Выборка.КонтрагентПредставление + Символы.ПС);
				МассивСтрок.Добавить(НСтр("ru = 'задолженность'", "ru") + Символы.ПС);
				Для Каждого Задолжность Из Задолжности Цикл
					МассивСтрок.Добавить(Новый ФорматированнаяСтрока(
							Формат(Задолжность.Сумма, "ЧДЦ=2"), 
							Новый Шрифт(,, Истина), 
							ЦветаСтиля.ЦветАкцента));
					Если Задолжность.Валюта <> Null Тогда
						МассивСтрок.Добавить(" ");
						МассивСтрок.Добавить(Задолжность.Валюта);
					КонецЕсли;
					МассивСтрок.Добавить(Символы.ПС);
				КонецЦикла;
				
				ЭлементРезультатаПоиска.Представление = Новый ФорматированнаяСтрока(МассивСтрок);				
			КонецЕсли;
			
			ЭлементРезультатаПоиска.Картинка = БиблиотекаКартинок.Контрагент;
			ЭлементРезультатаПоиска.Действия.Добавить("Заказ", НСтр("ru = 'Новый заказ'", "ru"), БиблиотекаКартинок.СоздатьЭлементСписка);
			
			РезультатПоиска.Добавить(ЭлементРезультатаПоиска);
		КонецЕсли;
		
		Если РезультатПоиска.Количество() = МаксимальноеКоличествоКонтрагентов Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла

КонецПроцедуры
	